{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "try:\n",
    "    import cPickle as pickle\n",
    "except:\n",
    "    import pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "beijing = pd.read_excel('.\\\\aqi7city.xlsx',header=None, sheet_name=0, names=['date','aqi','degree','pm25','pm10','so2','co','no2','o3_8h'])\n",
    "shanghai = pd.read_excel('.\\\\aqi7city.xlsx',header=None,sheet_name=1, names=['date','aqi','degree','pm25','pm10','so2','co','no2','o3_8h'])\n",
    "chengdu = pd.read_excel('.\\\\aqi7city.xlsx',header=None,sheet_name=2, names=['date','aqi','degree','pm25','pm10','so2','co','no2','o3_8h'])\n",
    "wuhan = pd.read_excel('.\\\\aqi7city.xlsx',header=None,sheet_name=3, names=['date','aqi','degree','pm25','pm10','so2','co','no2','o3_8h'])\n",
    "guangzhou = pd.read_excel('.\\\\aqi7city.xlsx',header=None,sheet_name=4, names=['date','aqi','degree','pm25','pm10','so2','co','no2','o3_8h'])\n",
    "xian = pd.read_excel('.\\\\aqi7city.xlsx',header=None,sheet_name=5, names=['date','aqi','degree','pm25','pm10','so2','co','no2','o3_8h'])\n",
    "nanjing = pd.read_excel('.\\\\aqi7city.xlsx',header=None,sheet_name=6, names=['date','aqi','degree','pm25','pm10','so2','co','no2','o3_8h'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "cities = ['beijing', 'shanghai', 'chengdu', 'wuhan', 'guangzhou', 'xian', 'nanjing']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>aqi</th>\n",
       "      <th>degree</th>\n",
       "      <th>pm25</th>\n",
       "      <th>pm10</th>\n",
       "      <th>so2</th>\n",
       "      <th>co</th>\n",
       "      <th>no2</th>\n",
       "      <th>o3_8h</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2013-12-02</td>\n",
       "      <td>180</td>\n",
       "      <td>中度污染</td>\n",
       "      <td>136</td>\n",
       "      <td>253</td>\n",
       "      <td>87</td>\n",
       "      <td>2.0</td>\n",
       "      <td>120</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2013-12-03</td>\n",
       "      <td>234</td>\n",
       "      <td>重度污染</td>\n",
       "      <td>184</td>\n",
       "      <td>297</td>\n",
       "      <td>108</td>\n",
       "      <td>2.5</td>\n",
       "      <td>133</td>\n",
       "      <td>17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>2013-12-04</td>\n",
       "      <td>386</td>\n",
       "      <td>严重污染</td>\n",
       "      <td>336</td>\n",
       "      <td>455</td>\n",
       "      <td>51</td>\n",
       "      <td>2.5</td>\n",
       "      <td>130</td>\n",
       "      <td>43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>2013-12-05</td>\n",
       "      <td>328</td>\n",
       "      <td>严重污染</td>\n",
       "      <td>278</td>\n",
       "      <td>386</td>\n",
       "      <td>52</td>\n",
       "      <td>2.3</td>\n",
       "      <td>110</td>\n",
       "      <td>59</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>2013-12-06</td>\n",
       "      <td>319</td>\n",
       "      <td>严重污染</td>\n",
       "      <td>269</td>\n",
       "      <td>389</td>\n",
       "      <td>61</td>\n",
       "      <td>2.2</td>\n",
       "      <td>92</td>\n",
       "      <td>36</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        date  aqi degree  pm25  pm10  so2   co  no2  o3_8h\n",
       "0 2013-12-02  180   中度污染   136   253   87  2.0  120     25\n",
       "1 2013-12-03  234   重度污染   184   297  108  2.5  133     17\n",
       "2 2013-12-04  386   严重污染   336   455   51  2.5  130     43\n",
       "3 2013-12-05  328   严重污染   278   386   52  2.3  110     59\n",
       "4 2013-12-06  319   严重污染   269   389   61  2.2   92     36"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nanjing.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2281"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "timeStamps = nanjing.date.unique() #2280\n",
    "len(timeStamps) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "bj = beijing.drop(['date', 'degree'], axis=1)\n",
    "sh = shanghai.drop(['date', 'degree'], axis=1)\n",
    "cd = chengdu.drop(['date', 'degree'], axis=1)\n",
    "wh = wuhan.drop(['date', 'degree'], axis=1)\n",
    "gz = guangzhou.drop(['date', 'degree'], axis=1)\n",
    "xa = xian.drop(['date', 'degree'], axis=1)\n",
    "nj = nanjing.drop(['date', 'degree'], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#join different cities\n",
    "df_joint = pd.concat([bj,sh,cd,wh,gz,xa,nj], axis=1)\n",
    "aqi2d = df_joint.values # dataframe to numpy array\n",
    "aqi3d = aqi2d.reshape((aqi2d.shape[0],7,7)) # 2d to 3d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>aqi</th>\n",
       "      <th>pm25</th>\n",
       "      <th>pm10</th>\n",
       "      <th>so2</th>\n",
       "      <th>co</th>\n",
       "      <th>no2</th>\n",
       "      <th>o3_8h</th>\n",
       "      <th>aqi</th>\n",
       "      <th>pm25</th>\n",
       "      <th>pm10</th>\n",
       "      <th>...</th>\n",
       "      <th>co</th>\n",
       "      <th>no2</th>\n",
       "      <th>o3_8h</th>\n",
       "      <th>aqi</th>\n",
       "      <th>pm25</th>\n",
       "      <th>pm10</th>\n",
       "      <th>so2</th>\n",
       "      <th>co</th>\n",
       "      <th>no2</th>\n",
       "      <th>o3_8h</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>142</td>\n",
       "      <td>109</td>\n",
       "      <td>138</td>\n",
       "      <td>61</td>\n",
       "      <td>2.6</td>\n",
       "      <td>88</td>\n",
       "      <td>11</td>\n",
       "      <td>267</td>\n",
       "      <td>217</td>\n",
       "      <td>252</td>\n",
       "      <td>...</td>\n",
       "      <td>3.2</td>\n",
       "      <td>77</td>\n",
       "      <td>17</td>\n",
       "      <td>180</td>\n",
       "      <td>136</td>\n",
       "      <td>253</td>\n",
       "      <td>87</td>\n",
       "      <td>2.0</td>\n",
       "      <td>120</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>86</td>\n",
       "      <td>64</td>\n",
       "      <td>86</td>\n",
       "      <td>38</td>\n",
       "      <td>1.6</td>\n",
       "      <td>54</td>\n",
       "      <td>45</td>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "      <td>152</td>\n",
       "      <td>...</td>\n",
       "      <td>2.1</td>\n",
       "      <td>50</td>\n",
       "      <td>31</td>\n",
       "      <td>234</td>\n",
       "      <td>184</td>\n",
       "      <td>297</td>\n",
       "      <td>108</td>\n",
       "      <td>2.5</td>\n",
       "      <td>133</td>\n",
       "      <td>17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>109</td>\n",
       "      <td>82</td>\n",
       "      <td>101</td>\n",
       "      <td>42</td>\n",
       "      <td>2.0</td>\n",
       "      <td>62</td>\n",
       "      <td>23</td>\n",
       "      <td>158</td>\n",
       "      <td>121</td>\n",
       "      <td>140</td>\n",
       "      <td>...</td>\n",
       "      <td>2.2</td>\n",
       "      <td>52</td>\n",
       "      <td>25</td>\n",
       "      <td>386</td>\n",
       "      <td>336</td>\n",
       "      <td>455</td>\n",
       "      <td>51</td>\n",
       "      <td>2.5</td>\n",
       "      <td>130</td>\n",
       "      <td>43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>56</td>\n",
       "      <td>39</td>\n",
       "      <td>56</td>\n",
       "      <td>30</td>\n",
       "      <td>1.2</td>\n",
       "      <td>38</td>\n",
       "      <td>52</td>\n",
       "      <td>288</td>\n",
       "      <td>238</td>\n",
       "      <td>251</td>\n",
       "      <td>...</td>\n",
       "      <td>1.9</td>\n",
       "      <td>48</td>\n",
       "      <td>34</td>\n",
       "      <td>328</td>\n",
       "      <td>278</td>\n",
       "      <td>386</td>\n",
       "      <td>52</td>\n",
       "      <td>2.3</td>\n",
       "      <td>110</td>\n",
       "      <td>59</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>169</td>\n",
       "      <td>128</td>\n",
       "      <td>162</td>\n",
       "      <td>48</td>\n",
       "      <td>2.5</td>\n",
       "      <td>78</td>\n",
       "      <td>15</td>\n",
       "      <td>468</td>\n",
       "      <td>452</td>\n",
       "      <td>472</td>\n",
       "      <td>...</td>\n",
       "      <td>2.3</td>\n",
       "      <td>67</td>\n",
       "      <td>26</td>\n",
       "      <td>319</td>\n",
       "      <td>269</td>\n",
       "      <td>389</td>\n",
       "      <td>61</td>\n",
       "      <td>2.2</td>\n",
       "      <td>92</td>\n",
       "      <td>36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2276</td>\n",
       "      <td>70</td>\n",
       "      <td>51</td>\n",
       "      <td>75</td>\n",
       "      <td>10</td>\n",
       "      <td>0.9</td>\n",
       "      <td>26</td>\n",
       "      <td>68</td>\n",
       "      <td>65</td>\n",
       "      <td>47</td>\n",
       "      <td>52</td>\n",
       "      <td>...</td>\n",
       "      <td>1.4</td>\n",
       "      <td>49</td>\n",
       "      <td>128</td>\n",
       "      <td>95</td>\n",
       "      <td>71</td>\n",
       "      <td>91</td>\n",
       "      <td>9</td>\n",
       "      <td>1.1</td>\n",
       "      <td>40</td>\n",
       "      <td>45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2277</td>\n",
       "      <td>53</td>\n",
       "      <td>37</td>\n",
       "      <td>47</td>\n",
       "      <td>5</td>\n",
       "      <td>0.6</td>\n",
       "      <td>22</td>\n",
       "      <td>79</td>\n",
       "      <td>44</td>\n",
       "      <td>28</td>\n",
       "      <td>36</td>\n",
       "      <td>...</td>\n",
       "      <td>1.2</td>\n",
       "      <td>30</td>\n",
       "      <td>90</td>\n",
       "      <td>52</td>\n",
       "      <td>32</td>\n",
       "      <td>53</td>\n",
       "      <td>4</td>\n",
       "      <td>0.6</td>\n",
       "      <td>19</td>\n",
       "      <td>96</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2278</td>\n",
       "      <td>40</td>\n",
       "      <td>28</td>\n",
       "      <td>32</td>\n",
       "      <td>4</td>\n",
       "      <td>0.5</td>\n",
       "      <td>24</td>\n",
       "      <td>56</td>\n",
       "      <td>47</td>\n",
       "      <td>29</td>\n",
       "      <td>44</td>\n",
       "      <td>...</td>\n",
       "      <td>0.9</td>\n",
       "      <td>21</td>\n",
       "      <td>34</td>\n",
       "      <td>54</td>\n",
       "      <td>30</td>\n",
       "      <td>57</td>\n",
       "      <td>6</td>\n",
       "      <td>0.6</td>\n",
       "      <td>28</td>\n",
       "      <td>91</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2279</td>\n",
       "      <td>88</td>\n",
       "      <td>65</td>\n",
       "      <td>63</td>\n",
       "      <td>3</td>\n",
       "      <td>0.7</td>\n",
       "      <td>29</td>\n",
       "      <td>74</td>\n",
       "      <td>52</td>\n",
       "      <td>36</td>\n",
       "      <td>42</td>\n",
       "      <td>...</td>\n",
       "      <td>0.9</td>\n",
       "      <td>26</td>\n",
       "      <td>35</td>\n",
       "      <td>34</td>\n",
       "      <td>21</td>\n",
       "      <td>28</td>\n",
       "      <td>4</td>\n",
       "      <td>0.6</td>\n",
       "      <td>27</td>\n",
       "      <td>63</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2280</td>\n",
       "      <td>114</td>\n",
       "      <td>86</td>\n",
       "      <td>57</td>\n",
       "      <td>2</td>\n",
       "      <td>1.2</td>\n",
       "      <td>32</td>\n",
       "      <td>26</td>\n",
       "      <td>47</td>\n",
       "      <td>26</td>\n",
       "      <td>16</td>\n",
       "      <td>...</td>\n",
       "      <td>0.8</td>\n",
       "      <td>28</td>\n",
       "      <td>74</td>\n",
       "      <td>38</td>\n",
       "      <td>21</td>\n",
       "      <td>24</td>\n",
       "      <td>4</td>\n",
       "      <td>0.5</td>\n",
       "      <td>30</td>\n",
       "      <td>53</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2281 rows × 49 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      aqi  pm25  pm10  so2   co  no2  o3_8h  aqi  pm25  pm10  ...   co  no2  \\\n",
       "0     142   109   138   61  2.6   88     11  267   217   252  ...  3.2   77   \n",
       "1      86    64    86   38  1.6   54     45  200   150   152  ...  2.1   50   \n",
       "2     109    82   101   42  2.0   62     23  158   121   140  ...  2.2   52   \n",
       "3      56    39    56   30  1.2   38     52  288   238   251  ...  1.9   48   \n",
       "4     169   128   162   48  2.5   78     15  468   452   472  ...  2.3   67   \n",
       "...   ...   ...   ...  ...  ...  ...    ...  ...   ...   ...  ...  ...  ...   \n",
       "2276   70    51    75   10  0.9   26     68   65    47    52  ...  1.4   49   \n",
       "2277   53    37    47    5  0.6   22     79   44    28    36  ...  1.2   30   \n",
       "2278   40    28    32    4  0.5   24     56   47    29    44  ...  0.9   21   \n",
       "2279   88    65    63    3  0.7   29     74   52    36    42  ...  0.9   26   \n",
       "2280  114    86    57    2  1.2   32     26   47    26    16  ...  0.8   28   \n",
       "\n",
       "      o3_8h  aqi  pm25  pm10  so2   co  no2  o3_8h  \n",
       "0        17  180   136   253   87  2.0  120     25  \n",
       "1        31  234   184   297  108  2.5  133     17  \n",
       "2        25  386   336   455   51  2.5  130     43  \n",
       "3        34  328   278   386   52  2.3  110     59  \n",
       "4        26  319   269   389   61  2.2   92     36  \n",
       "...     ...  ...   ...   ...  ...  ...  ...    ...  \n",
       "2276    128   95    71    91    9  1.1   40     45  \n",
       "2277     90   52    32    53    4  0.6   19     96  \n",
       "2278     34   54    30    57    6  0.6   28     91  \n",
       "2279     35   34    21    28    4  0.6   27     63  \n",
       "2280     74   38    21    24    4  0.5   30     53  \n",
       "\n",
       "[2281 rows x 49 columns]"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_joint"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### normalization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2281, 7, 7)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aqi3d.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[142., 267., 265., ...,  77., 251., 180.],\n",
       "       [ 86., 200., 269., ..., 149., 127., 234.],\n",
       "       [109., 158., 285., ..., 134.,  90., 386.],\n",
       "       ...,\n",
       "       [ 40.,  47., 138., ...,  54.,  33.,  54.],\n",
       "       [ 88.,  52.,  38., ...,  44.,  48.,  34.],\n",
       "       [114.,  47.,  69., ...,  62.,  59.,  38.]])"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aqi3d[:,:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def array_normalize(array):\n",
    "    maxVal = np.amax(array)\n",
    "    minVal = np.amin(array)\n",
    "#     print(maxVal)\n",
    "#     print(minVal)\n",
    "    return (array - minVal) / (maxVal - minVal)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "normAqi3d = np.zeros_like(aqi3d)\n",
    "for i in range(aqi3d.shape[0]):\n",
    "    normAqi3d[i,:,:] = array_normalize(aqi3d[i,:,:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2281, 7, 7)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normAqi3d.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### extract dataset seq2seq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy import zeros, newaxis\n",
    "def extract_dataset_seq2seq(frames,n_steps,lag):\n",
    "    '''\n",
    "    this fun get inputs from the output of extract_frame_new()\n",
    "    frames: the proprocessed data in ndarray\n",
    "    n_steps: length of RNN window\n",
    "    lag: the time lag from x to y\n",
    "    '''\n",
    "    X, Y = list(), list()\n",
    "    for i in range(len(frames)):\n",
    "        end_ix = i + n_steps\n",
    "        \n",
    "        if end_ix > len(frames) - lag-1:\n",
    "            break\n",
    "        X_i, Y_i = frames[i:end_ix], frames[i+lag:end_ix+lag]\n",
    "        X.append(X_i)\n",
    "        Y.append(Y_i)\n",
    "    XX = np.asarray(X)\n",
    "    YY = np.asarray(Y)\n",
    "    \n",
    "    return XX[:,:,:,:,newaxis], YY[:,:,:,:,newaxis]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y = extract_dataset_seq2seq(normAqi3d,5,5)\n",
    "with open('X7city.pkl', 'wb') as fp1:\n",
    "    pickle.dump(X, fp1)\n",
    "\n",
    "with open('y7city.pkl', 'wb') as fp2:\n",
    "    pickle.dump(y, fp2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.layers.convolutional import Conv3D\n",
    "from keras.layers.convolutional_recurrent import ConvLSTM2D\n",
    "from keras.layers.normalization import BatchNormalization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### seq2seq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "seq = Sequential()\n",
    "seq.add(ConvLSTM2D(filters=1, kernel_size=(2, 2),\n",
    "                   input_shape=(None, 7, 7, 1),\n",
    "                   padding='same', return_sequences=True))\n",
    "seq.add(BatchNormalization())\n",
    "\n",
    "seq.add(ConvLSTM2D(filters=1, kernel_size=(2, 2),\n",
    "                   padding='same', return_sequences=True))\n",
    "seq.add(BatchNormalization())\n",
    "\n",
    "seq.add(Conv3D(filters=1, kernel_size=(3, 3, 3),\n",
    "               activation='sigmoid',\n",
    "               padding='same', data_format='channels_last'))\n",
    "seq.compile(loss='mean_absolute_error', optimizer='sgd')\n",
    "# seq.compile(loss='mean_squared_error', optimizer='sgd', metrics=['mae', 'acc'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv_lst_m2d_1 (ConvLSTM2D)  (None, None, 7, 7, 1)     36        \n",
      "_________________________________________________________________\n",
      "batch_normalization_1 (Batch (None, None, 7, 7, 1)     4         \n",
      "_________________________________________________________________\n",
      "conv_lst_m2d_2 (ConvLSTM2D)  (None, None, 7, 7, 1)     36        \n",
      "_________________________________________________________________\n",
      "batch_normalization_2 (Batch (None, None, 7, 7, 1)     4         \n",
      "_________________________________________________________________\n",
      "conv3d_1 (Conv3D)            (None, None, 7, 7, 1)     28        \n",
      "=================================================================\n",
      "Total params: 108\n",
      "Trainable params: 104\n",
      "Non-trainable params: 4\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "seq.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('X7city.pkl', 'rb') as file:\n",
    "    X = pickle.load(file)\n",
    "with open('y7city.pkl', 'rb') as file1:\n",
    "    Y = pickle.load(file1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2271, 5, 7, 7, 1)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2271, 5, 7, 7, 1)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = X[:2000]\n",
    "Y_train = Y[:2000]\n",
    "\n",
    "X_test = X[2000:2275]\n",
    "Y_test = Y[2000:2275]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1900 samples, validate on 100 samples\n",
      "Epoch 1/20\n",
      "1900/1900 [==============================] - 14s 8ms/step - loss: 0.2650 - val_loss: 0.2270\n",
      "Epoch 2/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1882 - val_loss: 0.1635\n",
      "Epoch 3/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1528 - val_loss: 0.1440\n",
      "Epoch 4/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1448 - val_loss: 0.1374\n",
      "Epoch 5/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1408 - val_loss: 0.1330\n",
      "Epoch 6/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1377 - val_loss: 0.1297\n",
      "Epoch 7/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1352 - val_loss: 0.1272\n",
      "Epoch 8/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1331 - val_loss: 0.1253\n",
      "Epoch 9/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1317 - val_loss: 0.1239\n",
      "Epoch 10/20\n",
      "1900/1900 [==============================] - 10s 6ms/step - loss: 0.1304 - val_loss: 0.1228\n",
      "Epoch 11/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1293 - val_loss: 0.1219\n",
      "Epoch 12/20\n",
      "1900/1900 [==============================] - 10s 6ms/step - loss: 0.1284 - val_loss: 0.1212\n",
      "Epoch 13/20\n",
      "1900/1900 [==============================] - 11s 6ms/step - loss: 0.1275 - val_loss: 0.1205\n",
      "Epoch 14/20\n",
      "1900/1900 [==============================] - 11s 6ms/step - loss: 0.1269 - val_loss: 0.1200\n",
      "Epoch 15/20\n",
      "1900/1900 [==============================] - 11s 6ms/step - loss: 0.1265 - val_loss: 0.1194\n",
      "Epoch 16/20\n",
      "1900/1900 [==============================] - 11s 6ms/step - loss: 0.1258 - val_loss: 0.1190\n",
      "Epoch 17/20\n",
      "1900/1900 [==============================] - 10s 6ms/step - loss: 0.1254 - val_loss: 0.1187\n",
      "Epoch 18/20\n",
      "1900/1900 [==============================] - 11s 6ms/step - loss: 0.1252 - val_loss: 0.1183\n",
      "Epoch 19/20\n",
      "1900/1900 [==============================] - 10s 5ms/step - loss: 0.1249 - val_loss: 0.1179\n",
      "Epoch 20/20\n",
      "1900/1900 [==============================] - 11s 6ms/step - loss: 0.1246 - val_loss: 0.1176\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x25471445b70>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "seq.fit(X_train, Y_train, batch_size=10, epochs=20, validation_split=0.05)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# prediction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "Y_hat = seq.predict(X_test, verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(271, 5, 7, 7, 1)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y_hat.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## visulization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cities = ['beijing', 'shanghai', 'chengdu', 'wuhan', 'guangzhou', 'xian', 'nanjing']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 756x1152 with 8 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random\n",
    "length = Y_hat.shape[0]\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "random_ind = random.sample(range(0, length-1), 6)\n",
    "\n",
    "\n",
    "y_pre_0 = Y_hat[random_ind[0],4,:,:,0]\n",
    "y_pre_1 = Y_hat[random_ind[1],4,:,:,0]\n",
    "y_pre_2 = Y_hat[random_ind[2],4,:,:,0]\n",
    "y_pre_3 = Y_hat[random_ind[3],4,:,:,0]\n",
    "\n",
    "y_truth_0 = Y_test[random_ind[0],4,:,:,0]\n",
    "y_truth_1 = Y_test[random_ind[1],4,:,:,0]\n",
    "y_truth_2 = Y_test[random_ind[2],4,:,:,0]\n",
    "y_truth_3 = Y_test[random_ind[3],4,:,:,0]\n",
    "\n",
    "stations = ['Beijing', 'Shanghai', 'Chengdu', 'Wuhan', 'Guangzhou', 'Xi\\'an','Nanjing']\n",
    "#     fea = ['co', 'no2', 'o3', 'pm10', 'pm2.5', 'so2', 'pressure', 'temperature', 'humidity']\n",
    "fea = ['AQI','PM2.5','PM10',r'SO$_2$','CO', r'NO$_2$', r'O$_3$']\n",
    "\n",
    "fig, (ax1, ax2)= plt.subplots(1, 2, sharey=True, sharex=True, figsize=(10.5, 16))\n",
    "\n",
    "# plt.yticks(np.arange(7), stations, fontsize=12)\n",
    "# ax1.set_yticklabels(stations,fontsize=13,rotation=30)\n",
    "# ax1.set_xticklabels(fea)\n",
    "#         plt.xticks = [0, 1, 2,3,4,5,6,7,8]\n",
    "# plt.setp(ax1, xticks = [0, 1, 2,3,4,5,6,7,8])\n",
    "# plt.setp(ax2, yticks = [0, 1, 2,3,4,5,6])\n",
    "\n",
    "xticks = [0, 1, 2,3,4,5,6]\n",
    "yticks = [0, 1, 2,3,4,5,6]\n",
    "\n",
    "# plt.setp(ax1.get_xticklabels(), rotation=40, ha=\"right\", rotation_mode=\"anchor\")\n",
    "# plt.setp(ax2.get_xticklabels(), rotation=30)\n",
    "\n",
    "\n",
    "\n",
    "plt.subplot(421,sharex=ax1)\n",
    "plt.imshow(y_pre_0, cmap='Blues')\n",
    "plt.text(2, -0.8, 'Predition', fontsize=13)\n",
    "plt.setp(plt.gca(), yticks=yticks, yticklabels=stations)\n",
    "\n",
    "plt.subplot(422, sharex=ax2)\n",
    "plt.imshow(y_truth_0, cmap='Blues')\n",
    "plt.text(2, -0.8, 'Ground truth', fontsize=13)\n",
    "\n",
    "plt.subplot(423,sharex=ax1)\n",
    "plt.imshow(y_pre_1,cmap='Blues')\n",
    "plt.setp(plt.gca(), yticks=yticks, yticklabels=stations)\n",
    "\n",
    "plt.subplot(424, sharex=ax2)\n",
    "plt.imshow(y_truth_1,cmap='Blues')\n",
    "\n",
    "plt.subplot(425, sharex=ax1)\n",
    "plt.imshow(y_pre_2,cmap='Blues')\n",
    "plt.setp(plt.gca(), yticks=yticks, yticklabels=stations)\n",
    "\n",
    "plt.subplot(426, sharex=ax2)\n",
    "plt.imshow(y_truth_2,cmap='Blues')\n",
    "\n",
    "plt.subplot(427, sharex=ax1)\n",
    "plt.imshow(y_pre_3,cmap='Blues')\n",
    "plt.setp(plt.gca(), yticks=yticks, yticklabels=stations)\n",
    "# plt.setp(plt.gca(), xticks=xticks, xticklabels=fea,\n",
    "#          yticks=yticks, yticklabels=stations)\n",
    "\n",
    "plt.subplot(428, sharex=ax2)\n",
    "plt.imshow(y_truth_3,cmap='Blues')\n",
    "plt.setp(plt.gca(), xticks=xticks, xticklabels=fea)\n",
    "for ax in fig.axes:\n",
    "    plt.sca(ax)\n",
    "    plt.xticks(rotation=35)\n",
    "\n",
    "\n",
    "# cbar = fig.colorbar(im)\n",
    "# cbar.solids.set_edgecolor(\"face\")\n",
    "plt.savefig('predict-map-7city.png', dpi=100, bbox_inches ='tight')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python(keras-tf)",
   "language": "python",
   "name": "tensorflow"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
